import dayjs from 'dayjs'
import Decimal from 'decimal.js'

export type ByteUnit =
  | 'B'
  | 'KB'
  | 'MB'
  | 'GB'
  | 'TB'
  | 'PB'
  | 'EB'
  | 'ZB'
  | 'YB'
  | 'BB'

export type BpsUnit =
  | 'bps'
  | 'Kbps'
  | 'Mbps'
  | 'Gbps'
  | 'Tbps'
  | 'Pbps'
  | 'Ebps'
  | 'Zbps'
  | 'Ybps'
  | 'Bbps'

/**
 * 格式化浮点数，保留2位小数
 * @param val 数值
 * @param force 为真的话强制保留两位小数，否则末尾为0的小数不显示
 * @returns
 */
export function formatFloat(val: number | string, force = true) {
  const d = new Decimal(val)
  let str = d.toFixed(2, Decimal.ROUND_FLOOR).toString()
  if (force) {
    return str
  }
  while (str.endsWith('0')) {
    str = str.substring(0, str.length - 1)
  }
  if (str.endsWith('.')) {
    str = str.substring(0, str.length - 1)
  }
  return str
}

/**
 * 字节转换，默认按照常规格式转换，如果指定单位，则表表示把字节转为制定单位表示
 * @param byte
 * @param unit
 * @returns
 */
export function formatBytes(byte: number | string, unit?: ByteUnit) {
  const units: ByteUnit[] = [
    'B',
    'KB',
    'MB',
    'GB',
    'TB',
    'PB',
    'EB',
    'ZB',
    'YB',
    'BB',
  ]
  const ret = {
    value: byte.toString(),
    unit: unit || ('B' as ByteUnit),
    toString(separator = ' ') {
      return `${this.value}${separator}${this.unit}`
    },
  }
  byte = Number(byte)
  if (!byte) {
    byte = 0
  }
  if (byte < 1) {
    return ret
  }
  let index = Math.floor(Math.log(byte) / Math.log(1024))
  if (unit) {
    index = units.indexOf(unit)
  }
  ret.value = formatFloat(byte / 1024 ** index, false)
  ret.unit = units[index] as ByteUnit
  return ret
}

/**
 * 格式化时间
 */
export function formatDate(
  unix: number | string | undefined,
  template = 'YYYY-MM-DD HH:mm:ss',
) {
  return unix && String(unix) !== '0'
    ? dayjs.unix(Number(unix)).format(template)
    : '-'
}
/**
 * 处理空值
 * @param value 原数据
 * @returns
 */
export function formatEmptyValue(value: any) {
  if (
    value === ''
    || value === void 0
    || value === null
    || (Array.isArray(value) && !value.length)
  ) {
    return '-'
  }
  return value
}

/**
 * 格式化带宽，数值单位为Mbps，数值小于1000的时候为Mbps，否则为Gbps
 * @param bandwidth
 */
export function formatBandwidth(bandwidth: number | string | undefined | null) {
  if (!bandwidth) {
    return ''
  }
  const val = Number(bandwidth)
  if (val < 1000) {
    return `${bandwidth} Mbps`
  }
  return `${(val / 1000).toFixed(0)} Gbps`
}
